home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume89
/
graphics
/
dobbs_ex.1
< prev
next >
Wrap
Text File
|
1989-08-23
|
7KB
|
287 lines
Path: xanth!lll-winken!ames!sun-barr!newstop!sun!swap!page
From: page%swap@Sun.COM (Bob Page)
Newsgroups: comp.sources.amiga
Subject: v89i173: dobbs-examples - from dr. dobbs july 89 article
Message-ID: <123144@sun.Eng.Sun.COM>
Date: 23 Aug 89 06:55:35 GMT
Sender: news@sun.Eng.Sun.COM
Lines: 276
Approved: page@sun.com
Submitted-by: cmcmanis@Eng.Sun.COM (Chuck McManis)
Posting-number: Volume 89, Issue 173
Archive-name: graphics/dobbs-ex.1
These are the sources for the two examples in the July '89 Dr. Dobbs
article "Multitasking OS and Graphics Co-processors".
# This is a shell archive.
# Remove anything above and including the cut line.
# Then run the rest of the file through 'sh'.
# Unpacked files will be owned by you and have default permissions.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: SHell ARchive
# Run the following text through 'sh' to create:
# README
# blit.c
# dualvp.c
# This is archive 1 of a 1-part kit.
# This archive created: Tue Aug 22 23:55:07 1989
echo "extracting README"
sed 's/^X//' << \SHAR_EOF > README
XThese are the sources for the two examples in the Dr. Dobbs article
X"Multitasking OS and Graphics Co-processors". This article appears in
Xthe July 1989 issue.
X
X--Chuck McManis
Xuucp: {anywhere}!sun!cmcmanis BIX: cmcmanis ARPAnet: cmcmanis@sun.com
XThese opinions are my own and no one elses, but you knew that didn't you.
SHAR_EOF
echo "extracting blit.c"
sed 's/^X//' << \SHAR_EOF > blit.c
X/*
X * blit.c - Demonstrates the benefit of the blitter.
X *
X * Written 4/9/89 by C. McManis using Lattice C 5.02
X *
X * The difference on my machine between waiting for the blitter
X * to complete before calculating the next set of draw parameters
X * is 1.6 vs 1.4 seconds, about a 12.5% increase in speed.
X */
X
X#include <exec/types.h>
X#include <exec/memory.h>
X#include <intuition/intuition.h>
X#include <graphics/gfx.h>
X
Xextern struct IntuitionBase *IntuitionBase;
Xextern struct GfxBase *GfxBase;
X
X
Xstruct NewScreen NS = {
X 0, 0, /* Position on the display */
X 320, 200, 4, /* Attributes (Width, Height, Depth) */
X 1,0, /* Detail and Block pens */
X 0, /* ViewModes nothing special */
X CUSTOMSCREEN, /* It is our own screen we want */
X 0, /* Using the Default font */
X "Blitter Test", /* With a simple title. */
X 0, /* No special gadgets */
X 0 /* And no special bitmap */
X };
Xstruct Screen *MyScreen;
Xstruct RastPort *RPort;
X
Xvoid
Xcleanup(n)
X int n;
X{
X if (GfxBase)
X CloseLibrary(GfxBase);
X
X if (MyScreen)
X CloseScreen(MyScreen);
X
X if (IntuitionBase)
X CloseLibrary(IntuitionBase);
X exit(n);
X}
X
Xvoid
Xmain()
X{
X
X
X int i, /* Loop counter */
X x, y, c, /* some random draw parameters */
X t0[2], /* Start Time */
X t1[2]; /* End time */
X
X IntuitionBase = (struct IntuitionBase *)
X OpenLibrary("intuition.library",0L);
X if (! IntuitionBase)
X cleanup(1);
X
X GfxBase = (struct GfxBase *)
X OpenLibrary("graphics.library", 0L);
X if (! GfxBase)
X cleanup(1);
X
X
X /* This does all of the view construction for us */
X
X MyScreen = (struct Screen *) OpenScreen(&NS);
X
X if (!MyScreen)
X cleanup(1);
X
X timer(t0); /* Start the clock running */
X
X /* Get the RastPort of this screen */
X RPort = &(MyScreen->RastPort);
X
X SetAPen(RPort, 1); /* Foreground pen = 1 */
X SetBPen(RPort, 0); /* Background pen = 0 */
X
X srand(42); /* set the seed */
X Move(RPort, 160, 100); /* Move to the moiddle of the screen */
X
X /*
X * Note we generate psuedo random numbers (eg the same set of
X * random numbers every time.
X */
X for (i=0; i<100000; i++) {
X x = (rand() % 300) + 10;
X y = (rand() % 180) + 10;
X c = rand() % 16;
X SetAPen(RPort, c);
X Draw(RPort, x, y);
X#ifdef WAIT_BLIT
X WaitBlit(); /* Simulate non-coprocessor */
X#endif
X }
X
X timer(t1); /* stop the clock */
X
X#ifdef WAIT_BLIT
X printf("With waiting for the blitter, we took %d microseconds.\n",
X (t1[0] - t0[0]) * 1000000 + (t1[1] - t0[1]));
X#else
X printf("Without waiting for the blitter, we took %d microseconds.\n",
X (t1[0] - t0[0]) * 1000000 + (t1[1] - t0[1]));
X#endif
X
X cleanup(0);
X}
SHAR_EOF
echo "extracting dualvp.c"
sed 's/^X//' << \SHAR_EOF > dualvp.c
X/*
X * dualvp.c - Dual Viewports on the amiga
X * Written 4/4/89 by C. McManis using Lattice C 5.02
X */
X
X#include <exec/types.h>
X#include <exec/memory.h>
X#include <graphics/gfx.h>
X#include <graphics/view.h>
X#include <graphics/gfxbase.h>
X#include <graphics/rastport.h>
X
Xextern struct GfxBase *GfxBase;
X
Xchar *TextString = "Amiga Graphics Example";
X
X /* Viewport 0 colors */
XUWORD colors0[4] = {0xccc, 0x000, 0x0f0, 0x00f},
X /* Viewport 1 colors */
X colors1[4] = {0x0f0, 0xc0c, 0xf00, 0xfff};
Xvoid
X_main()
X{
X struct View MyView, *OldView;
X struct ViewPort Vp0, Vp1;
X struct BitMap Bits;
X struct RasInfo MyRaster;
X struct RastPort rp;
X int i;
X
X /* Open the resident graphics library */
X GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L);
X if (!GfxBase)
X exit(1);
X
X OldView = GfxBase->ActiView; /* Save this away */
X
X /* Initialize the View structures */
X InitView(&MyView);
X InitVPort(&Vp0);
X InitVPort(&Vp1);
X
X Vp1.Next = NULL;
X Vp0.Next = &Vp1; /* create a linked list of viewports */
X MyView.ViewPort = &Vp0; /* With the first one being Vp0 */
X
X /* Set up some display memory */
X
X InitBitMap(&Bits, 2, 640, 200);
X Bits.Planes[0] = (PLANEPTR)
X AllocMem(2*RASSIZE(640, 200),MEMF_CHIP+MEMF_CLEAR);
X Bits.Planes[1] = Bits.Planes[0] + RASSIZE(640, 200);
X if (!Bits.Planes[0])
X goto cleanup;
X
X MyRaster.BitMap = &Bits;
X MyRaster.RxOffset = 0;
X MyRaster.RyOffset = 0;
X MyRaster.Next = NULL;
X
X /* Both viewports are looking at the same display memory but have
X * different sets of colors
X */
X
X Vp0.RasInfo = &MyRaster;
X Vp0.DWidth = 320;
X Vp0.DHeight = 175;
X Vp0.ColorMap = (struct ColorMap *)GetColorMap(4);
X LoadRGB4(&Vp0, colors0, 4);
X
X Vp1.RasInfo = &MyRaster;
X Vp1.DWidth = 640;
X Vp1.DHeight = 20;
X Vp1.DyOffset = 179;
X Vp1.Modes = HIRES;
X Vp1.ColorMap = (struct ColorMap *)GetColorMap(4);
X LoadRGB4(&Vp1, colors1, 4);
X
X
X /* Initialize a RastPort so that we can draw into that memory. */
X InitRastPort(&rp);
X rp.BitMap = &Bits;
X SetAPen(&rp, 1); /* Foreground color */
X SetBPen(&rp, 0); /* Background color */
X Move(&rp, 3, 12); /* Move the graphics cursor to (3, 12) */
X /* Write something */
X Text(&rp, TextString, strlen(TextString));
X
X MakeVPort(&MyView, &Vp0); /* Build the copper list for Viewport 0 */
X MakeVPort(&MyView, &Vp1); /* Build the copper list for Viewport 1 */
X MrgCop(&MyView); /* Merge it into the final list */
X
X LoadView(&MyView); /* Show it off */
X
X /* SPIN FOR A WHILE */
X for (i=0; i<1000000; i++)
X ;
X
X LoadView(OldView); /* Return to the old view */
X
X
Xcleanup:
X /* Now give back the memory other tasks may need it */
X
X if (!Vp0.ColorMap)
X FreeColorMap(Vp0.ColorMap);
X
X if (!Vp1.ColorMap)
X FreeColorMap(Vp1.ColorMap);
X
X FreeVPortCopLists(&Vp0);
X FreeVPortCopLists(&Vp1);
X FreeCprList(MyView.LOFCprList);
X
X
X if (!Bits.Planes[0])
X FreeMem(Bits.Planes[0], 2*RASSIZE(640, 200));
X
X if (!GfxBase)
X CloseLibrary(GfxBase);
X
X exit(0);
X}
SHAR_EOF
echo "End of archive 1 (of 1)"
# if you want to concatenate archives, remove anything after this line
exit